package com.cskaoyan.javse.object._5finalize;

/**
 * @description: finalize方法
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * finalize方法:
 * 1.方法的声明和方法体:
 * protected void finalize() throws Throwable { }
 * 该方法的访问权限修饰符是protected,如果不重写方法访问权限,只能在子类中创建子类自身对象,才能够调用该方法
 * throws Throwable 它表示抛出异常的可能性(明天讲)
 * 该方法需要子类自己重写去实现功能,这种方法比接口的抽象方法要自由，因为它不是强制的(设计方式可以学习一下)
 *
 * 了解的知识点:
 * 2.方法的作用
 *      对象的生命周期,从对象的出生到销毁都是一系列的方法调用
 *      在C++当中对象的诞生: 调用构造函数,对象的销毁会调用析构函数,去做对象死亡的"善后"工作
 *          对象的销毁的"善后"工作: 对象自身占用的内存空间可以被准确回收(手动或者自动),
 *              但是对象除了自身要占用内存空间,还有占用很多额外资源
 *              比如对象如果做文件操作,需要占用IO资源,如果做网络传输,需要占用网络资源
 *              这些额外资源是需要进行额外的工作去释放它们的
 *          C++当中的析构函数就是用来释放它们的,C++程序员可以将释放资源的代码写入析构函数,在对象被销毁时,析构函数会自动调用,释放掉对象占用的额外资源
 *      Java当中的finalize方法也就是依照析构函数设计的,java程序员可以将释放额外资源的代码放入finalize方法,那么在对象对象被GC销毁回收空间时,finalize方法也会自动调用,然后执行释放资源代码,从而完成资源释放,完成对象死亡的"善后"工作
 *      C++的析构函数是可以正常应用和释放额外资源的,但是java的finalize是不行的
 *      因为GC的垃圾回收是不确定的,连带着finalize方法的执行也是不确定的,如果GC迟迟不销毁对象,那么额外资源就要始终被对象所占用,会导致资源浪费,甚至导致资源不够用等情况
 *      资源释放是很重要的事情,将重要的事情交给不靠谱的人做是不正确的选择,所以Java中对象占用资源的释放必须手动,不能像C++中那样去自动完成
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        /*Demo d = new Demo();
        d.finalize();*/
        //匿名对象很快会等待回收
        new Student();
        System.gc(); //用于通知GC进行垃圾回收
    }
}

class Student {
    @Override
    protected void finalize() throws Throwable {
        System.out.println("模拟资源释放!!~~~");
    }
}